package datenverwaltung;

import java.awt.Cursor;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JTable;

public class MeldungVerwaltenThread extends Thread implements DBVerbindung {

	private String id;
	private String art, ort, beschreibung;
	private JProgressBar progressBar;
	private JFrame container;
	private boolean löschen;
	private JTable tabelle;

	/**
	 * Wird dieser Konstruktor aufgerufen, wird die Meldung mit der übergebenen
	 * ID auf inaktiv gesetzt. Die übergebene Progressbar ist der Ladebalken,
	 * der nach Ausführen der aktion gestoppt wird. Ist das löschen Attribut auf
	 * true gesetzt wird die Meldung vollständig gelöscht!
	 * 
	 * @param id
	 *            Meldungs-ID
	 * @param progressBar
	 * @param container
	 * @param löschen
	 * @param tabelle
	 */
	public MeldungVerwaltenThread(String id, JProgressBar progressBar,
			JFrame container, boolean löschen, JTable tabelle) {
		super();
		this.id = id;
		this.progressBar = progressBar;
		this.container = container;
		art = ort = beschreibung = null;
		this.löschen = löschen;
		this.tabelle = tabelle;
	}

	/**
	 * Wird dieser Konstruktor aufgerufen wird die Meldung mit der übergebenen
	 * ID entsprechend den Attributen abgeändert. Die übergebene Progressbar ist
	 * der Ladebalken, der nach Ausführen der aktion gestoppt wird.
	 * 
	 * @param id
	 * @param art
	 * @param ort
	 * @param beschreibung
	 * @param progressBar
	 * @param container
	 * @param tabelle
	 */
	public MeldungVerwaltenThread(String id, String art, String ort,
			String beschreibung, JProgressBar progressBar, JFrame container,
			JTable tabelle) {
		super();
		this.id = id;
		this.art = art;
		this.ort = ort;
		this.beschreibung = beschreibung;
		this.progressBar = progressBar;
		this.container = container;
		this.löschen = false;
		this.tabelle = tabelle;
	}

	@Override
	public void run() {
		if (art == null) {
			// Meldung inaktiv schalten
			meldungInaktivSchalten(id);
		} else {
			// Meldung abändern
			meldungÄndern(id, art, ort, beschreibung);
		}
		progressBar.setIndeterminate(false);
		container.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		tabelle.getSelectionModel().clearSelection();
	}

	@Override
	public Connection getConnection() throws Exception {
		Connection connection;
		Class.forName("com.mysql.jdbc.Driver");
		connection = DriverManager.getConnection(DB_CONNECTION_URL,
				DB_USERNAME, DB_PASSWORD);
		return connection;
	}

	@Override
	public ResultSet executeStatementOnDB(String update) throws Exception {
		Connection connection = getConnection();
		Statement statement = connection.createStatement();
		statement.executeUpdate(update);
		return null;
	}

	/**
	 * Schaltet die Meldung mit der übergebenen ID auf inaktiv. Falls löschen
	 * auf true gesetzt ist, wird die Meldung vollständig gelöscht!
	 * 
	 * @param id
	 *            Meldungs-ID
	 */
	private void meldungInaktivSchalten(String id) {
		String update;
		if (!löschen)
			update = "update meldung set aktiv=false where id=\"" + id + "\";";
		else
			update = "delete from meldung where id=\"" + id + "\";";
		try {
			executeStatementOnDB(update);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void meldungÄndern(String id, String art, String ort,
			String beschreibung) {
		String update = "update meldung set art=\"" + art + "\", ort=\"" + ort
				+ "\", beschreibung=\"" + beschreibung + "\" where id=\"" + id
				+ "\";";
		try {
			executeStatementOnDB(update);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Liefert eine Liste der Meldungen zurück.
	 * 
	 * @return ArrayList von Meldungen
	 * @throws Exception
	 */
	public ArrayList<Meldung> getMeldungen() throws Exception {
		ArrayList<Meldung> liste = new ArrayList<Meldung>();
		String select = "select tracker.id tracker_id,art,ort,erstellzeitpunkt,latitude,longitude,beschreibung,anzAktiv,anzInaktiv,meldung.id from tracker,meldung where tracker.id=meldung.tracker_id and meldung.aktiv=true order by erstellzeitpunkt desc;";
		ResultSet result = executeStatementOnDB(select);
		while (result.next()) {
			String zeitString = result.getString("erstellzeitpunkt");
			Timestamp datetime = Timestamp.valueOf(zeitString);
			GPSKoordinaten koordinaten = new GPSKoordinaten(
					Double.parseDouble(result.getString("latitude")),
					Double.parseDouble(result.getString("longitude")));
			Meldung m = new Meldung(result.getString("art"),
					result.getString("ort"), result.getString("tracker_id"),
					result.getString("id"), result.getString("beschreibung"),
					datetime, koordinaten, Integer.parseInt(result
							.getString("anzAktiv")), Integer.parseInt(result
							.getString("anzInaktiv")));
			liste.add(m);
		}
		return liste;
	}

}
